﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Xml;
using System.Xml.Schema;

namespace TVLDesktop
{
    public partial class GestionDeGente : Form
    {
        public Gente persona;
        public GestionDeGente()
        {
            InitializeComponent();
            persona = new Gente();
        }

        private void label6_Click(object sender, EventArgs e)
        {

        }

        private void dataGridView1_SelectionChanged(object sender, EventArgs e)
        {
        }

        private void tabla_RowValidated(object sender, DataGridViewCellEventArgs e)
        {

        }

        private void tabla_RowEnter(object sender, DataGridViewCellEventArgs e)
        {
            if (tabla.Rows[e.RowIndex].Cells[14].Value != null)
            {
                tbNombre.Text = tabla.Rows[e.RowIndex].Cells[0].Value.ToString();
                persona.nombre = tbNombre.Text;

                tbRES.Text = tabla.Rows[e.RowIndex].Cells[1].Value.ToString();
                persona.atributos.Resistencia = int.Parse(tbRES.Text);

                tbVOL.Text = tabla.Rows[e.RowIndex].Cells[2].Value.ToString();
                persona.atributos.Voluntad = int.Parse(tbVOL.Text);

                tbFUE.Text = tabla.Rows[e.RowIndex].Cells[3].Value.ToString();
                persona.atributos.Fuerza = int.Parse(tbFUE.Text);

                tbPER.Text = tabla.Rows[e.RowIndex].Cells[4].Value.ToString();
                persona.atributos.Percepcion = int.Parse(tbPER.Text);

                tbAGI.Text = tabla.Rows[e.RowIndex].Cells[5].Value.ToString();
                persona.atributos.Agilidad = int.Parse(tbAGI.Text);

                tbINT.Text = tabla.Rows[e.RowIndex].Cells[6].Value.ToString();
                persona.atributos.Inteligencia = int.Parse(tbINT.Text);

                tbREF.Text = tabla.Rows[e.RowIndex].Cells[7].Value.ToString();
                persona.atributos.Reflejos = int.Parse(tbREF.Text);

                tbCON.Text = tabla.Rows[e.RowIndex].Cells[8].Value.ToString();
                persona.atributos.Consciencia = int.Parse(tbCON.Text);

                tbVACIO.Text = tabla.Rows[e.RowIndex].Cells[9].Value.ToString();
                persona.atributos.Vacio = int.Parse(tbVACIO.Text);

                persona.HabilDist = int.Parse(tabla.Rows[e.RowIndex].Cells[10].Value.ToString());
                persona.arma1 = tabla.Rows[e.RowIndex].Cells[11].Value.ToString();

                persona.HabilCaC = int.Parse(tabla.Rows[e.RowIndex].Cells[12].Value.ToString());
                persona.arma2 = tabla.Rows[e.RowIndex].Cells[13].Value.ToString();

                persona.armadura = int.Parse(tabla.Rows[e.RowIndex].Cells[14].Value.ToString());
                tbArmadura.Text = persona.armadura.ToString();

                tbTierra.Text = persona.atributos.Tierra().ToString();
                tbFuego.Text = persona.atributos.Fuego().ToString();
                tbAgua.Text = persona.atributos.Agua().ToString();
                tbAire.Text = persona.atributos.Aire().ToString();
            }
        }

        private void guardarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            saveFileDialog1.ShowDialog();
        }

        private void cargarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            openFileDialog1.ShowDialog();
        }

        private void saveFileDialog1_FileOk(object sender, CancelEventArgs e)
        {
            FileStream fs = new FileStream(saveFileDialog1.FileName, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);
            /*BinaryFormatter BF = new BinaryFormatter();
            BF.Serialize(fs, todos);*/
            
            BinaryWriter BW = new BinaryWriter(fs, Encoding.UTF8);
            Gente persona = new Gente();
            int j = tabla.Rows.Count - 1;
            BW.Write(j);
            for (int i = 0; i < j; i++)
            {
                persona = SacardeTabla(i);
                BW.Write(persona.nombre);
                BW.Write(persona.atributos.Resistencia);
                BW.Write(persona.atributos.Voluntad);
                BW.Write(persona.atributos.Fuerza);
                BW.Write(persona.atributos.Percepcion);
                BW.Write(persona.atributos.Agilidad);
                BW.Write(persona.atributos.Inteligencia);
                BW.Write(persona.atributos.Reflejos);
                BW.Write(persona.atributos.Consciencia);
                BW.Write(persona.atributos.Vacio);
                BW.Write(persona.HabilDist);
                BW.Write(persona.arma1);
                BW.Write(persona.HabilCaC);
                BW.Write(persona.arma2);
                BW.Write(persona.armadura);
            }
            fs.Flush();
            fs.Close();
        }

        public Gente SacardeTabla(int i)
        {
            Gente persona = new Gente();
            if (tabla.Rows[i].Cells[14].Value != null)
            {
                persona.nombre = tabla.Rows[i].Cells[0].Value.ToString();

                persona.atributos.Resistencia = int.Parse(tabla.Rows[i].Cells[1].Value.ToString());

                persona.atributos.Voluntad = int.Parse(tabla.Rows[i].Cells[2].Value.ToString());

                persona.atributos.Fuerza = int.Parse(tabla.Rows[i].Cells[3].Value.ToString());

                persona.atributos.Percepcion = int.Parse(tabla.Rows[i].Cells[4].Value.ToString());

                persona.atributos.Agilidad = int.Parse(tabla.Rows[i].Cells[5].Value.ToString());

                persona.atributos.Inteligencia = int.Parse(tabla.Rows[i].Cells[6].Value.ToString());

                persona.atributos.Reflejos = int.Parse(tabla.Rows[i].Cells[7].Value.ToString());

                persona.atributos.Consciencia = int.Parse(tabla.Rows[i].Cells[8].Value.ToString());

                persona.atributos.Vacio = int.Parse(tabla.Rows[i].Cells[9].Value.ToString());

                persona.HabilDist = int.Parse(tabla.Rows[i].Cells[10].Value.ToString());
                persona.arma1 = tabla.Rows[i].Cells[11].Value.ToString();

                persona.HabilCaC = int.Parse(tabla.Rows[i].Cells[12].Value.ToString());
                persona.arma2 = tabla.Rows[i].Cells[13].Value.ToString();

                persona.armadura = int.Parse(tabla.Rows[i].Cells[14].Value.ToString());

            }
            return persona;
        }

        public void MeterenTabla(Gente persona)
        {
            int i = tabla.Rows.Count-1;
            tabla.Rows.Add();
            tabla.Rows[i].Cells[0].Value = persona.nombre;
            tabla.Rows[i].Cells[1].Value = persona.atributos.Resistencia;
            tabla.Rows[i].Cells[2].Value = persona.atributos.Voluntad;
            tabla.Rows[i].Cells[3].Value = persona.atributos.Fuerza;
            tabla.Rows[i].Cells[4].Value = persona.atributos.Percepcion;
            tabla.Rows[i].Cells[5].Value = persona.atributos.Agilidad;
            tabla.Rows[i].Cells[6].Value = persona.atributos.Inteligencia;
            tabla.Rows[i].Cells[7].Value = persona.atributos.Reflejos;
            tabla.Rows[i].Cells[8].Value = persona.atributos.Consciencia;
            tabla.Rows[i].Cells[9].Value = persona.atributos.Vacio;

            tabla.Rows[i].Cells[10].Value = persona.HabilDist;
            tabla.Rows[i].Cells[11].Value = persona.arma1;
            tabla.Rows[i].Cells[12].Value = persona.HabilCaC;
            tabla.Rows[i].Cells[13].Value = persona.arma2;

            tabla.Rows[i].Cells[14].Value = persona.armadura;
            
        }

        private void openFileDialog1_FileOk(object sender, CancelEventArgs e)
        {
            FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open, FileAccess.Read);
            BinaryReader BR = new BinaryReader(fs, Encoding.UTF8);
            Gente persona;
            int cant = BR.ReadInt32();
            int actual = tabla.Rows.Count - 1;
            //tsProceso.Text = "Cargando datos...";
            DialogResult asd = MessageBox.Show("¿Quieres borrar lo que hay actualmente en la tabla?", "Ey!!!", MessageBoxButtons.YesNo);
            if (asd == DialogResult.Yes)
            {
                tabla.Rows.Clear();
                actual = 0;
            }
            for (int i = 0; i < cant; i++)
            {
                persona = new Gente();
                persona.nombre = BR.ReadString();
                persona.atributos.Resistencia = BR.ReadInt32();
                persona.atributos.Voluntad = BR.ReadInt32();
                persona.atributos.Fuerza = BR.ReadInt32();
                persona.atributos.Percepcion = BR.ReadInt32();
                persona.atributos.Agilidad = BR.ReadInt32();
                persona.atributos.Inteligencia = BR.ReadInt32();
                persona.atributos.Reflejos = BR.ReadInt32();
                persona.atributos.Consciencia = BR.ReadInt32();
                persona.atributos.Vacio = BR.ReadInt32();
                persona.HabilDist = BR.ReadInt32();
                persona.arma1 = BR.ReadString();
                persona.HabilCaC = BR.ReadInt32();
                persona.arma2 = BR.ReadString();
                persona.armadura = BR.ReadInt32();
                MeterenTabla(persona);
            }
            fs.Flush();
            fs.Close();
        }

        private void btnSimular_Click(object sender, EventArgs e)
        {
            tsProceso.Text = "Calculando probabilidades...";
            int atrib = 0;
            int cant = 250;
            if (cbDist.Text == "Reflejos")
                atrib = persona.atributos.Reflejos;
            else
                atrib = persona.atributos.Agilidad;
            System.Threading.Thread.Sleep(2);
            
            tsProgreso.Value = 0;
            tsProgreso.Maximum = 12;
            List<float> tiradas = persona.SimularX(persona.HabilCaC, persona.atributos.Agilidad, cant);
            CaC10.Text = persona.Porcentaje(tiradas, 10).ToString() + " %";
            tsProgreso.Value++;
            CaC15.Text = persona.Porcentaje(tiradas, 15).ToString() + " %";
            tsProgreso.Value++;
            CaC20.Text = persona.Porcentaje(tiradas, 20).ToString() + " %";
            tsProgreso.Value++;
            CaC25.Text = persona.Porcentaje(tiradas, 25).ToString() + " %";
            tsProgreso.Value++;
            CaC30.Text = persona.Porcentaje(tiradas, 30).ToString() + " %";
            tsProgreso.Value++;
            CaC35.Text = persona.Porcentaje(tiradas, 35).ToString() + " %";
            tsProgreso.Value++;


            tiradas = persona.SimularX(persona.HabilDist, atrib, cant);
            Dist10.Text = persona.Porcentaje(tiradas, 10).ToString() + " %";
            tsProgreso.Value++;
            Dist15.Text = persona.Porcentaje(tiradas, 15).ToString() + " %";
            tsProgreso.Value++;
            Dist20.Text = persona.Porcentaje(tiradas, 20).ToString() + " %";
            tsProgreso.Value++;
            Dist25.Text = persona.Porcentaje(tiradas, 25).ToString() + " %";
            tsProgreso.Value++;
            Dist30.Text = persona.Porcentaje(tiradas, 30).ToString() + " %";
            tsProgreso.Value++;
            Dist35.Text = persona.Porcentaje(tiradas, 35).ToString() + " %";
            tsProgreso.Value++;
            tsProceso.Text = "Standby";
            


        }

        private void toolStripStatusLabel1_Click(object sender, EventArgs e)
        {

        }


    }
    public class Gente
    {
        public string nombre;
        public ListaAtributos atributos;
        public int armadura;
        public int HabilDist;
        public string arma1;//Arma a distancia
        public int HabilCaC;
        public string arma2;//Arma a CaC
        public Gente()
        {
            atributos = new ListaAtributos();
        }

        public float Porcentaje(List<float> L, int D)
        {
            float Ok = 0;
            float T = L.Count;
            for (int i = 0; i < L.Count; i++)
            {
                if (L[i] >= D)
                    Ok++;
            }
            float resul=0.0f;
            resul = (Ok / T) * 100;
            return resul;
        }

        public List<float> SimularX(int Habilidad, int Atributo, int Cantidad)
        {
            int H = Habilidad;
            int A = Atributo;
            int C = Cantidad;
            List<float> tiradas= new List<float>();
            if (Cantidad < 1)
                C = 50;

            for (int i = 0; i < C; i++)
            {
                    tiradas.Add(calcularTirada(H, A));
            }

            return tiradas;
        }

        public int calcularTirada(int Habilidad, int Atributo)
        {
            int tirada=0;
            int num = 0;
            int acum = 0;
            Random rand = new Random(DateTime.Now.Millisecond);
            List<int> tiradas = new List<int>();
            int T = Habilidad + Atributo;
            for (int i = 0; i < T; i++)
            {
                num = 0;
                do
                {
                    System.Threading.Thread.Sleep(2);
                    num = rand.Next(1, 11);
                    acum += num;
                }while(num==10);
                tiradas.Add(num);
            }

            for (int j = 0; j < Atributo; j++)
            {
                num = tiradas.Min();
                acum -= num;
                tiradas.Remove(num);
            }

            tirada = acum;
            return tirada;
        }
    }
    public class ListaAtributos
    {
        public int Resistencia;
        public int Voluntad;
        public int Fuerza;
        public int Percepcion;
        public int Agilidad;
        public int Inteligencia;
        public int Reflejos;
        public int Consciencia;
        public int Vacio;
        public int Tierra()
        {
            if (Resistencia <= Voluntad)
                return Resistencia;
            else
                return Voluntad;
        }
        public int Agua()
        {
            if (Fuerza <= Percepcion)
                return Fuerza;
            else
                return Percepcion;
        }
        public int Fuego()
        {
            if (Agilidad <= Inteligencia)
                return Agilidad;
            else
                return Inteligencia;
        }
        public int Aire()
        {
            if (Reflejos <= Consciencia)
                return Reflejos;
            else
                return Consciencia;
        }
    }
}
